﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace MotoGame.Estados
{
    public class GerenciadorEstados
    {
        //TODO uma classe para adicionar estados, já na lista, e um upate ou draw segundo estado atual
        #region Properties
        private IDictionary<MainGame.Estado, EstadoBase> stateMap;
        protected IDictionary<MainGame.Estado, EstadoBase> StateMap
        {
            get { return stateMap; }
            set { stateMap = value; }
        }

        private EstadoBase active;
        public EstadoBase Active
        { 
            get { return active; }
            private set { active = value; } 
        }
        #endregion

        #region Constructors
        public GerenciadorEstados()
        {
            StateMap = new Dictionary<MainGame.Estado, EstadoBase>();
        }
        #endregion

        #region EstadoBase Management
        public GerenciadorEstados Add(MainGame.Estado name, EstadoBase state)
        {
            // TODO what if the active state is swapped out?
            // TODO null checking
            StateMap[name] = state;

            return this;
        }

        public void GoTo(MainGame.Estado name)
        {
            // TODO what if there is no state with that name?
            if (Active != null)
            {
                Active.Terminate();
            }

            Active = StateMap[name];

            if (Active != null)
            {
                Active.Start();
            }
        }
        #endregion

        #region Game Operations
        public void Update(GameTime gameTime)
        {
            Active.Update(gameTime);
        }

        public void Draw(GameTime gameTime, SpriteBatch spriteBatch)
        {
            Active.Draw(gameTime, spriteBatch);
        }
        #endregion
    }
}
